#include "head.h"
// 单链表的创建
u_list *init_register(void)
{
    u_list *list = (u_list *)malloc(sizeof(u_list));
    if (list != NULL)
    {
        list->next = NULL;
    }
    else
    {
        printf("创建失败!\n");
        return NULL;
    }
    return list;
}

// 单链表的插入

void insert_node(u_list *list, user_data data, int pos)
{
    if (list == NULL)
    {
        printf("链表为NULL\n");
        return;
    }

    user_node *new_node = (user_node *)malloc(sizeof(user_node));
    if (new_node == NULL)
    {
        printf("new_node创建失败\n");
        return;
    }
    new_node->next = NULL;
    new_node->data = data;

    if (pos == 1)
    {
        new_node->next = list->next;
        list->next = new_node;
        return;
    }

    user_node *ptr = list->next;

    for (size_t i = 1; i < pos-1  && ptr != NULL; i++)
    {
        ptr = ptr->next;
    }

    if (ptr == NULL)
    {
        printf("ptr已经指向NULL\n");
        free(new_node);
        return;
    }
    new_node->next = ptr->next;
    ptr->next = new_node;

    return;
    
    // user_node *new_node = (user_node *)malloc(sizeof(user_node));
    // if (new_node == NULL)
    // {
    //     printf("创建新节点失败\n");
    //     return;
    // }
    // new_node->data = data;
    // new_node->next = NULL;

    // // 判断是否为第一个元素或者链表为空
    // if (pos == 0 || list->next == NULL)
    // {
    //     new_node->next = list->next;
    //     list->next = new_node;
    //     return;
    // }
    // // 开始遍历，找到要插入位置的前一个元素
    // user_node *ptr = list->next;
    // for (int i = 0; i < pos - 1 && ptr != NULL; i++)
    // {
    //     ptr = ptr->next; // 遍历下一个结点
    // }
    // // 已经遍历到NULL位置
    // if (ptr == NULL)
    // {
    //     printf("插入位置超出范围\n");
    //     free(new_node);
    //     return;
    // }
    // 将新节点的next指针指向原插入位置的节点，将前一个节点的next指针指向新节点
    // new_node->next = ptr->next;
    // ptr->next = new_node;
}

// 单链表的删除
void delete_node(u_list *list, int pos)
{
    // 若链表为空
    if (list == NULL)
    {
        printf("链表不存在\n");
        return;
    }
    // 头删
    if (pos == 0)
    {
        if (list->next == NULL)
        {
            printf("链表为空，无法删除\n");
            return;
        }
        user_node *ptr = list->next;
        list->next = ptr->next;
        free(ptr);
        return;
    }
    // 任意删
    user_node *p = list->next;
    user_node *q = NULL;
    for (int i = 0; i < pos - 1 && p != NULL; i++)
    {
        p = p->next;
    }
    // 如果找不到要删除的节点，或者要删除的节点已经是最后一个节点，则提示错误并返回
    if (p == NULL || p->next == NULL)
    {
        printf("要删除的结点不存在\n");
        return;
    }
    q = p->next;
    p->next = q->next;
    free(q);
    return;
}
void delete_student(u_list *list,char *name)
{
    user_node *p = list->next;
    user_node *q = NULL;
    while (p!= NULL)
    {
        if (!strcmp(p->data.name, name))
        {
            if (p == list->next)
            {
                list->next = p->next;
            }
            else
            {
                q->next = p->next;
            }
            free(p);
            printf("删除成功!\n");
            return;
        }
        q = p;
        p = p->next;
    }
    printf("未找到该学生!\n");
}

// 单链表的查找
user_node *find_node_password(u_list *list, char *password)
{
    if (list == NULL)
    {
        printf("链表不存在\n");
        return NULL;
    }
    if (list->next == NULL)
    {
        printf("链表数据为空\n");
        return NULL;
    }
    // 创建一个指针来遍历
    user_node *ptr = list->next;

    // 遍历链表
    for (size_t i = 0; ptr != NULL; i++)
    {
        // 如果链表遍历到尽头还未找到指定位置的节点，则返回 NULL
        if (ptr == NULL)
        {
            printf("位置不存在结点\n");
            return NULL;
        }
        if (!strcmp(password, ptr->data.password))
        {
            printf("找到了%s\n", ptr->data.password);
            return ptr;
        }
        // 否则继续向后移动
        ptr = ptr->next;
    }
    // 返回找到的结点指针
    printf("没找到\n");
    return NULL;
}
user_node *find_node_id(u_list *list, int id)
{
    if (list == NULL)
    {
        printf("链表不存在\n");
        return NULL;
    }
    if (list->next == NULL)
    {
        printf("链表数据为空\n");
        return NULL;
    }
    // 创建一个指针来遍历
    user_node *ptr = list->next;
    // 遍历链表
    for (size_t i = 0; ptr != NULL; i++)
    {
        // 如果链表遍历到尽头还未找到指定位置的节点，则返回 NULL
        if (ptr == NULL)
        {
            printf("位置不存在结点\n");
            return NULL;
        }
        if (id == ptr->data.id)
        {
            printf("找到了\n");
            return ptr;
        }
        // 否则继续向后移动
        ptr = ptr->next;
    }
    // 返回找到的结点指针
    printf("没找到\n");
    return NULL;
}
user_node *find_node_name(u_list *list, char *name)
{
    if (list == NULL)
    {
        printf("链表不存在\n");
        return NULL;
    }
    if (list->next == NULL)
    {
        printf("链表数据为空\n");
        return NULL;
    }
    // 创建一个指针来遍历
    user_node *ptr = list->next;

    // 遍历链表
    for (size_t i = 0; ptr != NULL; i++)
    {
        // 如果链表遍历到尽头还未找到指定位置的节点，则返回 NULL
        if (ptr == NULL)
        {
            printf("位置不存在结点\n");
            return NULL;
        }
        if (!strcmp(name, ptr->data.name))
        {
            printf("找到了%s\n", ptr->data.name);
            return ptr;
        }
        // 否则继续向后移动
        ptr = ptr->next;
    }
    // 返回找到的结点指针
    printf("没找到\n");
    return NULL;
}

// 单链表的遍历
void print_register(u_list *list)
{
    if (list == NULL)
    {
        printf("链表不存在\n");
        return;
    }
    if (list->next == NULL)
    {
        printf("链表为空\n");
        return;
    }
    user_node *ptr = list->next;

    // 遍历链表并打印节点数据
    while (ptr != NULL)
    {
        printf("姓名:%s\t密码%s:\t账号:%d\n", ptr->data.name, ptr->data.password, ptr->data.id);
        // 将指针移到下一个节点
        ptr = ptr->next;
    }
}

//写入文件
void F_print(u_list *list, const char *file_name)
{
     // 安全判断
    if (list == NULL)
    {
        printf("链表为NULL\n");
        return;
    }
    if (list->next == NULL)
    {
        printf("链表无数据\n");
        return;
    }

    FILE *fp = fopen(file_name, "w+");
    if (fp == NULL)
    {
        printf("文件创建失败\n");
        return;
    }
    fseek(fp, 0, SEEK_SET);

    user_node *ptr = list->next;

    while (ptr != NULL)
    {
        fprintf(fp, "%s\t%s\t%d\n",
                ptr->data.name, ptr->data.password, ptr->data.id);
        ptr = ptr->next;
    }

    fflush(fp); // 刷新文件

    fclose(fp);
    // FILE *fp = fopen(file_name, "w");
    // if (fp == NULL)
    // {
    //     printf("文件创建失败");
    //     return;
    // }

    // // 光标移动到开头
    // fseek(fp, 0, SEEK_SET);

    // user_node *ptr = list->next;
    // while (ptr != NULL)
    // {
    //     fprintf(fp, "%s %s %d\n", ptr->data.name, ptr->data.password, ptr->data.id);
    //     ptr = ptr->next;
    // }
    // fclose(fp);
}
//读取文件
void F_scanf(u_list *list, const char *file_name)
{
     // 安全判断
    if (list == NULL)
    {
        printf("链表为NULL\n");
        return;
    }

    FILE *fp = fopen(file_name, "r");
    if (fp == NULL)
    {
        printf("文件打开失败\n");
        return;
    }
    // 移动光标
    fseek(fp, 0, SEEK_SET);
    // 清空链表
    // S_List_clear(list);

   
    char ch = '0';
    int pos = 0;

    // 检测文件行数
    while ((ch = fgetc(fp)) != EOF)
    {
        if (ch == '\n')
        {
            pos++;
        }
    }

    // 移动光标
    fseek(fp, 0, SEEK_SET);
     user_data data;

    for (size_t i = 0; i < pos; i++)
    {
        // "用户名:%s\t密码:%s\t身份码:%d\t余额:%d\n"
        fscanf(fp, "%s\t%s\t%d\n",
               data.name, data.password, &data.id);
        insert_node(list, data, i+1 );
    }

    fflush(fp); // 刷新文件

    fclose(fp);
    // FILE *fp = fopen(file_name, "r");
    // if (fp == NULL)
    // {
    //     printf("文件打开失败");
    //     return;
    // }

    // // 移动光标到头
    // fseek(fp, 0, SEEK_SET);

    // char ch = '0';
    // int len = 0;
    // while (EOF != (ch = fgetc(fp)))
    // {
    //     if ('\n' == ch)
    //     {
    //         len++;
    //     }
    // }

    // // 移动光标到头
    // fseek(fp, 0, SEEK_SET);
    // user_data data;
    
    // for (size_t i = 0; i < len; i++)
    // {
    //     fscanf(fp, "%s\t%s\t%d\n", data.name, data.password, &data.id);
    //     insert_node(list, data, i+1);
    // }

    // fclose(fp);
    // return;
    
}

// 单链表的清空
void S_List_clear(u_list *list)
{
   
    
    if (list == NULL)
    {
        printf("链表为NULL\n");
        return;
    }
    if (list->next == NULL)
    {
        printf("链表无数据\n");
        return;
    }

    user_node *ptr_1 = list->next;
    user_node *ptr_2 = ptr_1->next;

    while (ptr_1 != NULL)
    {
        free(ptr_1);
        ptr_1 = ptr_2;
        if (ptr_2 != NULL)
        {
            ptr_2 = ptr_2->next;
        }
    }
    list->next = NULL;
    
}

